package graphic.render;

import graphic.GameView;

import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.util.Random;

import model.Coordinate;
import model.entity.Entity2D;
import param.GraphicsParam;

public abstract class Render2D {

	public static final int ONLY_RED = 0;
	public static final int ONLY_GREEN = 1;
	public static final int ONLY_BlUE = 2;

	protected Coordinate coo;
	protected int[] renderAreaPixels;
	protected int[] entityPixles;
	protected int renderAreaWidth;
	protected int renderAreaHeight;
	protected int pixelX;
	protected int pixelY;
	protected int pixelColor;
	protected int xPos;
	protected int yPos;
	protected int xCentre;
	protected int yCentre;
	protected int width;
	protected int height;
	protected int arrayLength;
	
	
	/**
	 * Ormai li ho visti in tutte le salse ... godiamoci un po di droga pixelosa!
	 */
	public void randomPixels(){
		Random r = new Random();
		arrayLength = renderAreaPixels.length;
		for (int i = 0; i < arrayLength; i++) {
			renderAreaPixels[i] = 0xFF000000 | r.nextInt(12000);
		}
	}
	
	public void setRenderAreaPixels(int[] renderAreaPixels) {
		this.renderAreaPixels = renderAreaPixels;
	}
	
	public void setRenderAreaWidth(int renderAreaWidth) {
		this.renderAreaWidth = renderAreaWidth;
	}
	
	public void setRenderAreaHeight(int renderAreaHeight) {
		this.renderAreaHeight = renderAreaHeight;
	}
	
	/**
	 * Renderizzazione nell'area di render con le coordinate che puntano allo spigolo in alto a sinistra.
	 * @param entity entita' da renderizzare
	 */
	public abstract void render(Entity2D entity);
	
	/**
	 * Renderizzazione di piu' entita' nell'area di render con le coordinate che puntano allo spigolo in alto a sinistra.
	 * @param entity array di entita' da renderizzare
	 */
	public abstract void render(Entity2D[] entity);
	
	
	/**
	 * Renderizzazione nell'area di render con le coordinate che puntano al centro dell'entita'.
	 * @param entity entita' da renderizzare
	 */
	public abstract void centredRender(Entity2D entity);
	
	
	/**
	 * Renderizzazione di piu' entita' nell'area di render con le coordinate che puntano al centro dell'entita'.
	 * @param array di entity entita' da renderizzare
	 */
	public abstract void centredRender(Entity2D[] entities);
	
	/**
	 * Renderizzazione di una entita' con un singolo canale RGB attivo.
	 * Nota: usa il { @link centredRender() }
	 * @param whatColor quale canale della codifica RGB tenere attivo
	 * @param entity entita' da renderizzare
	 */
	public abstract void monoChromaticCentredRender(int whatColor, Entity2D entity);
	
	/**
	 * Renderizzazione di entita' con un singolo canale RGB attivo.
	 * @param whatColor quale canale della codifica RGB tenere attivo
	 * @param entity array di entita' da renderizzare
	 */
	public abstract void monoChromaticCentredRender(int whatColor, Entity2D[] entities);
	
	/**
	 * Metodo per il ripristino del buffer a PIXELS_DEFAULT_COLOR.
	 */
	public void cleanRenderArea() {
		arrayLength = renderAreaPixels.length;
		for (int i = 0; i < arrayLength; i++) {
			renderAreaPixels[i] = GraphicsParam.PIXELS_DEFAULT_COLOR;
		}
	}
	
	
	/**
	 * Verifica che l'entita' si trovi all'intenro dell'area di rendering.
	 * @param centerd indicare se si tratta di uno sprite centrato o meno
	 * @return true se e' all'interno dell'area di rendering
	 */
	protected boolean entityInsideOfTheRenderArea(boolean centerd) {
		//Almeno una delle due deve essere soddisfatta
		if(centerd){
			if( yCentre > renderAreaHeight || yPos + height < 0 ){
	    		return false;
	    	}
			if( xCentre > renderAreaWidth ||  xPos + width < 0 ){
				return false;
			}
	    	return true;
		}else{
			if( yPos > renderAreaHeight || yPos + height < 0 ){
	    		return false;
	    	}
			if( xPos > renderAreaWidth ||  xPos + width < 0 ){
				return false;
			}
			return true;
		}
	}
	
	/**
	 * Verifica che il pixel da renderizzare sia all'interno dell'area di rendering.
	 * @param pixelX coordinata x del pixel
	 * @param pixelY coordinata y del pixel
	 * @return
	 */
	protected boolean pixelInsideOfTheRenderArea(int pixelX, int pixelY) {
		if( pixelX > 0 && pixelX < this.renderAreaWidth){
			if( pixelY > 0 && pixelY < this.renderAreaHeight ){
				return true;
			}
		}
		return false;
	}

}